package it.albertus.cycles.data;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StreamCorruptedException;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.zip.CRC32;
import org.junit.Assert;
import org.junit.Test;
import it.albertus.cycles.model.BikesInf;
import it.albertus.util.IOUtils;
import it.albertus.util.logging.LoggerFactory;
public class DefaultBikesTest {
private static final Logger logger = LoggerFactory.getLogger(DefaultBikesTest.class);
@Test
public void test() throws IOException {
final InputStream is = new DefaultBikes().getInputStream();
final ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
IOUtils.copy(is, os, 128);
}
finally {
IOUtils.closeQuietly(os, is);
}
Assert.assertEquals(BikesInf.FILE_SIZE, os.size());
final CRC32 crc = new CRC32();
crc.update(os.toByteArray());
Assert.assertEquals(DefaultBikes.CRC, crc.getValue());
crc.reset();
crc.update(new DefaultBikes().getByteArray());
Assert.assertEquals(DefaultBikes.CRC, crc.getValue());
}
@Test
public void testReflection() throws NoSuchFieldException, IllegalAccessException, StreamCorruptedException {
final Field declaredField = DefaultBikes.class.getDeclaredField("DEFAULT");
declaredField.setAccessible(true);
final Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(declaredField, declaredField.getModifiers() & ~Modifier.FINAL);
final byte[] array = (byte[]) declaredField.get(null);
final int newLength = BikesInf.FILE_SIZE - 1 - (int) (Math.random() * BikesInf.FILE_SIZE / 2);
logger.info(Integer.toString(newLength));
declaredField.set(null, Arrays.copyOf(array, newLength));
try {
new DefaultBikes();
Assert.assertFalse(true);
}
catch (final StreamCorruptedException e) {
logger.log(Level.INFO, e.toString(), e);
Assert.assertTrue(true);
}
finally {
declaredField.set(null, Arrays.copyOf(array, BikesInf.FILE_SIZE));
}
Assert.assertNotNull(new DefaultBikes());
}
}